package br.jm.amanaje.web.beans;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.model.SelectItem;

import br.jm.amanaje.dao.TipoQualificacaoDAO;
import br.jm.amanaje.dao.UsuarioDAO;
import br.jm.amanaje.model.TipoQualificacao;
import br.jm.amanaje.model.Usuario;

@ManagedBean
@RequestScoped
public class UsuarioBean {

	private boolean exibirMensagemSucesso;
	private boolean exibirMensagemFalhaBusca;
	
	private Usuario usuario;
	private List<Usuario> usuariosCadastrados;
	private SelectItem[] tiposQualificacoes;
	private int[] nivelQualificacaoes;
	
	private UsuarioDAO usuarioDao;
	private TipoQualificacaoDAO tipoDao;
	
	public UsuarioBean() {
		this.usuarioDao = new UsuarioDAO();
		this.tipoDao = new TipoQualificacaoDAO();
		carregarTiposQualificacoes();
		limparContexto();
	}
	
	public void limparContexto() {
		this.exibirMensagemSucesso = 
		this.exibirMensagemFalhaBusca = false;
		this.usuario = new Usuario();
		this.usuariosCadastrados = new ArrayList<Usuario>();
		this.nivelQualificacaoes = null;
	}
	
	public void cadastrar() {
		this.usuarioDao.criar(usuario, nivelQualificacaoes);
		limparContexto();
		this.exibirMensagemSucesso = true;
	}
	
	public void recuperar() {
		if (this.usuario.temIdentidade()) {
			this.usuario = this.usuarioDao.recuperar(usuario.getIdentidade());
			if (this.usuario == null) {
				this.exibirMensagemFalhaBusca = true;
				return;
			}
			gerarNiveisQualificacoesUsuario();
		}
		else {
			this.usuariosCadastrados = this.usuarioDao.recuperarLista();
		}
	}
	
	public void atualizar() {
		if (this.usuarioDao.atualizar(usuario, nivelQualificacaoes)) {
			limparContexto();
			this.exibirMensagemSucesso = true;
		}
		else {
			this.exibirMensagemFalhaBusca = true;
		}
	}
	
	public void remover() {
		if (this.usuarioDao.remover(usuario)) {
			this.exibirMensagemSucesso = true;
			limparContexto();
		}
		else {
			this.exibirMensagemFalhaBusca = true;
		}
	}

	private void carregarTiposQualificacoes() {
		List<SelectItem> listaItens = new ArrayList<SelectItem>();
		for (TipoQualificacao tipo : this.tipoDao.cadastrarListaPadrao())
			listaItens.add(new SelectItem(tipo.getNivel(), tipo.getCurso()));
		this.tiposQualificacoes = listaItens.toArray(new SelectItem[listaItens.size()]);
	}
	
	private void gerarNiveisQualificacoesUsuario() {
		if (this.usuario.getQualificacoes() == null ||
				this.usuario.getQualificacoes().isEmpty()) return;
		int quantQualificacoes = this.usuario.getQualificacoes().size();
		this.nivelQualificacaoes = new int[quantQualificacoes];
		for (int numCurso = 0; numCurso < quantQualificacoes; 
				this.nivelQualificacaoes[numCurso] = 
						this.usuario.getQualificacoes().get(numCurso++).getNivel()); 
	}
	
	
	/**
	 * Getters e Setters
	 */
	public boolean getExibirMensagemSucesso() {
		return exibirMensagemSucesso;
	}
	
	public boolean getExibirMensagemFalhaBusca() {
		return exibirMensagemFalhaBusca;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public List<Usuario> getUsuariosCadastrados() {
		return usuariosCadastrados;
	}

	public void setUsuariosCadastrados(List<Usuario> usuariosCadastrados) {
		this.usuariosCadastrados = usuariosCadastrados;
	}

	public SelectItem[] getTiposQualificacoes() {
		return tiposQualificacoes;
	}

	public int[] getNivelQualificacaoes() {
		return nivelQualificacaoes;
	}

	public void setNivelQualificacaoes(int[] nivelQualificacaoes) {
		this.nivelQualificacaoes = nivelQualificacaoes;
	}

}
